package com.qf.service;

import com.qf.feign.CacheFeign;
import com.qf.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * 限流策略
 * 5分钟的限流策略/流量控制，5分钟之内对多发送3条短信
 *
 * @author zhaojian
 */
@Service(value = "limitFiveMinutes")
@Slf4j
public class LimitFiveMinutesServiceImpl implements FilterChainService {


    @Autowired
    private CacheFeign cacheFeign;

    /**
     * 5分钟的限流策略/流量控制，5分钟之内对多发送3条短信
     * <p>
     * **限流 : **限流规则如下
     * <p>
     * - 五分钟内，禁止相同客户账户ID向同一手机号码下发相同的短信超过3条；
     * - 一小时内，禁止相同客户账户ID向同一手机号码下发相同的短信超过5条；
     * - 24小时内，禁止相同客户账户ID向同一手机号码下发相同的短信超过10条；
     *
     * @param standardSubmit
     * @return
     */
    @Override
    public boolean strategy(StandardSubmit standardSubmit) {
        //1:客户ID
        Integer clientID = standardSubmit.getClientID();
        //2:手机号
        String destMobile = standardSubmit.getDestMobile();
        //3:发送时间  当前时间毫秒值   16:17  统计的结束时间
        long currentTimeMillis = System.currentTimeMillis();
        //  16:12 5分钟之前的毫秒值         统计的开始时间
        long before5TimeMills = currentTimeMillis - 60 * 5 * 1000;
        //4:五分钟内，禁止相同客户账户ID向同一手机号码下发相同的短信超过3条；
        String key = clientID + ":" + destMobile;
        Set<String> result = cacheFeign.zRangeByScore(key, before5TimeMills, currentTimeMillis);
        if (null != result && result.size() >= 3) {
            log.error("五分钟内，禁止相同客户账户ID向同一手机号码下发相同的短信超过3条");
            return false;
        }
        //每发送一条短信要使用Redis存储一下 ： 五大数据类型中？
        cacheFeign.zadd(key,String.valueOf(currentTimeMillis),currentTimeMillis);
        //没有问题
        return true;
    }



    /*
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);
        cacheFeign.zadd(key,"1",currentTimeMillis);*/

    /**
     *  有序集合类型
     *  zset 类型
     *
     *  小明  数学 100分  英语 88   语文 99
     *  小张  数学 78分  英语 88   语文 99
     *  小刘  数学 45分  英语 88   语文 99
     *  小赵  数学 10分  英语 88   语文 99
     *
     *  老师要统计：数学不合格的同学有哪些？
     *        数学 0   ~          59之间     就是不合格
     *      5分钟之前的毫秒值  ~  当前时间毫秒值    短信条数
     *      zadd  xiaoming 100  shuxue
     *
     */
}